﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using Ro.AssistFunction.Environment;
using Ro.AssistFunction.ExtentReport;
using Ro.AssistFunction.OutputManage;
using Ro.Common.RoArgs;
using Ro.Common.RoInterface;
using Ro.Interpreter.Cores;


namespace RoTestForUIA
{
    /// <summary>
    /// 主入口
    /// </summary>
    class Program
    {
        /// <summary>
        /// RoTestForUIA主程序入口
        /// </summary>
        /// <param name="args">参数追加</param>
        private static void Main(string[] args)
        {
            //初始化参数
            RoPubArgments.ProTips = false; //给定Pro版本标记符 false
            RoPubArgments.RoOutputToConsole = new RoOutputToConsole();
            RoPubArgments.SystemProperties = new List<Property>();  //初始化全参数List

            //初始化接口
            IRoEnvEvents roEnvEvents = new RoEnvEvents(); // 1.程序开始前优先检查环境
            IPreposeFunc preposeFunc = new PreposeFuncs(); //2.解析Tcs测试脚本文件
            IRoExtentReport roExtentReport = new RoExtentReport(); //初始化ER

            try
            {
                //1.环境检查
                bool envresult = roEnvEvents.EnvEvent(args); //检查参数是否正确,会造一个全局变量 RoTestArgsInfo

                //环境检查异常
                if (!envresult)
                {
                    RoPubArgments.RoOutputToConsole.OutputConsole(RoLogStatus.Fatal, "环境检查出错...请重新检查脚本或Bat文件...");
                    //Rolog信息
                    RoPubArgments.RoLog.Fatal("环境检查出错...请重新检查脚本或Bat文件...");
                    //存在无效路径退出
                    Environment.Exit(-1);
                }

                //环境检查正常， 开始正常操作
                else
                {
                    //读取dll文件
                    LoadDllFile();

                    string tcsfilename = Path.GetFileNameWithoutExtension(RoPubArgments.RoTestArgsInfo.TcsFilePath); //获取tcs文件名称
                    //初始化extentreport
                    roExtentReport.InitExtentReports(tcsfilename);

                    //TODO 2.载入Tcs文件, 此处应该使用Ro.Script.Interpreter中的RoTcsInterpreter中对标的方法
                    //反馈执行结果
                    bool backresult = preposeFunc.CoresFunc(RoPubArgments.RoTestArgsInfo.TcsFilePath); 

                    if (backresult)
                    {
                        RoPubArgments.RoOutputToConsole.OutputConsole(RoLogStatus.Pass,
                            "\r\n====================================================================\r\n" +
                            "Tcs脚本执行完毕，整体Tcs执行结果：通过!!!\r\n" +
                            "====================================================================\r\n");
                    }
                    else
                    {
                        RoPubArgments.RoOutputToConsole.OutputConsole(RoLogStatus.Fail,
                            "\r\n====================================================================\r\n" +
                            "Tcs脚本执行完毕，整体Tcs执行结果：失败!!!\r\n" +
                            "====================================================================\r\n");
                    }
                }
            }
            catch (Exception e)
            {
                ExceptionOutPut.SystemExceptionOut("Program-Community Version", e);
                //存在无效路径退出
                Environment.Exit(-1);
            }
        }


        /// <summary>
        /// 加载Dll文件
        /// </summary>
        private static void LoadDllFile()
        {
            //当前路径
            string str = Process.GetCurrentProcess().MainModule.FileName;
            string name = Path.GetDirectoryName(str);

            if (name != null)
            {
                DirectoryInfo theFolder = new DirectoryInfo(name);
                RoPubArgments.RoOutputToConsole.OutputConsole(RoLogStatus.Info, "准备载入Dll库文件");
                foreach (FileInfo sinFolder in theFolder.GetFiles())
                {
                    if (sinFolder.Extension.Equals(".dll"))
                    {
                        RoPubArgments.RoOutputToConsole.OutputConsole(RoLogStatus.Info, "完成载入Dll文件： " + sinFolder.Name);
                    }
                }
            }
        }
    }
}
